package main

import (
	"fmt"
	"runtime"
	"sync"
	"time"
)

func main() {
	//返回当前系统的 CPU 核数量
	fmt.Println("逻辑CPU的核数：", runtime.NumCPU())
	//获取goroot目录：
	fmt.Println("GOROOT-->", runtime.GOROOT()) // GOROOT--> D:\Program Files\Go

	//获取操作系统
	fmt.Println("os/platform-->", runtime.GOOS) // os/platform--> windows
	fmt.Println("当前程序中的 cgo 调用数量:", runtime.NumCgoCall())
	//runtime.Breakpoint() //断点
	//runtime.LockOSThread() // 通常情况下，runtime.LockOSThread() 函数会在与 C 语言交互时使用，确保在调用 C 函数时，goroutine 不会被 Go 运行时移动到其他线程上执行，从而保证 C 函数的执行环境稳定。

	Gosched()
	Goexit()
	fmt.Println("当前活动的 goroutine 数量:", runtime.NumGoroutine()) // 函数用于获取当前程序中正在执行的 goroutine 的数量。它返回一个整数，表示当前程序中正在活动的 goroutine 数量。

}

/*
*
runtime.Gosched()
让出时间片，先让别的协议执行，它执行完，再回来执行此协程
*/
func Gosched() {
	var wg sync.WaitGroup

	// 添加一个等待任务
	wg.Add(1)
	go func() {
		defer wg.Done()
		for i := 0; i < 5; i++ {
			fmt.Println("goroutine。。。")
		}

	}()

	for i := 0; i < 4; i++ {
		//让出时间片，先让别的协议执行，它执行完，再回来执行此协程
		runtime.Gosched()
		fmt.Println("main。。")
	}
	// 等待所有任务完成
	wg.Wait()
}

/*
*
runtime.Goexit() //终止所在的协程
*/
func Goexit() {
	go func() {

		fmt.Println("goroutine开始。。。")
		fun()
		fmt.Println("goroutine结束。。。")
	}()
	//睡一会儿，不让主协程结束
	time.Sleep(3 * time.Second)
}

func fun() {
	defer fmt.Println("defer。。。")

	//return           //终止此函数
	runtime.Goexit() //终止所在的协程

	fmt.Println("fun函数。。。")
}
